package main

import (
	"bytes"
	"fmt"
	"strings"
)

func main() {
	fmt.Println(comma(-5123456.223343))
	fmt.Println(comma2("helloworld,", "hello,world"))
}

/*
练习 3.10： 编写一个非递归版本的comma函数，使用bytes.Buffer代替字符串链接操作。

练习 3.11： 完善comma函数，以支持浮点数处理和一个可选的正负号的处理。
*/
func comma(str float64) string {
	s := fmt.Sprintf("%f", str)
	var end string
	if dot := strings.LastIndex(s, "."); dot >= 0 {
		end = s[dot:]
		s = s[:dot]
	}
	var buf bytes.Buffer
	j := 1
	for i := len(s) - 1; i >= 0; i-- {
		buf.WriteByte(s[i])
		if j%3 == 0 && i != 0 {
			buf.WriteString(",")
		}
		j++
	}
	res := buf.String()
	var r bytes.Buffer
	for i := len(res) - 1; i >= 0; i-- {
		r.WriteByte(res[i])
	}
	r.WriteString(end)
	return r.String()
}

// 练习 3.12： 编写一个函数，判断两个字符串是否是相互打乱的，也就是说它们有着相同的字符，但是对应不同的顺序。
func comma2(a string, b string) bool {
	if len(a) != len(b) {
		return false
	}
	aMap, bMap := make(map[byte]int), make(map[byte]int)
	for i := 0; i < len(a); i++ {
		if _, ok1 := aMap[a[i]]; ok1 {
			aMap[a[i]]++
		} else {
			aMap[a[i]] = 1
		}
		if _, ok2 := bMap[b[i]]; ok2 {
			bMap[b[i]]++
		} else {
			bMap[b[i]] = 1
		}
	}
	for k, v := range aMap {
		if bMap[k] != v {
			return false
		}
	}
	return true
}
